package com.ztr.leetcode.day02;

import java.util.*;
import java.util.stream.Collectors;

public class AnagramGrouper {
    public List<List<String>> groupAnagrams1(String[] strs) {
        // 使用Stream API和Collectors进行分组  
        Map<String, List<String>> grouped = Arrays.stream(strs)
                .collect(Collectors.groupingBy(str -> {
                    char[] array = str.toCharArray();
                    Arrays.sort(array);
                    return new String(array);
                }));

        // 将Map的values转换为List  
        return new ArrayList<>(grouped.values());
    }

    public List<List<String>> groupAnagrams2(String[] strs) {
        //边界条件判断
        if (strs == null || strs.length == 0)
            return new ArrayList<>();
        Map<String, List<String>> map = new HashMap<>();
        for (String s : strs) {
            char[] ca = new char[26];
            //统计字符串中每个字符串出现的次数
            for (char c : s.toCharArray())
                ca[c - 'a']++;
            //统计每个字符出现次数的数组转化为字符串
            String keyStr = String.valueOf(ca);
            if (!map.containsKey(keyStr))
                map.put(keyStr, new ArrayList<>());
            map.get(keyStr).add(s);
        }
        return new ArrayList<>(map.values());
    }

    public List<List<String>> groupAnagrams3(String[] strs) {
        //边界条件判断
        if (strs == null || strs.length == 0)
            return new ArrayList<>();
        //map中key存储的是字符串中字母排序后新的字符串
        Map<String, List<String>> map = new HashMap<>();
        for (int i = 0; i < strs.length; i++) {
            //取出字符串，然后把它转化为字符数组
            char[] c = strs[i].toCharArray();
            //对字符数组进行排序
            Arrays.sort(c);
            //排序之后再把它转化为一个字符串
            String keyStr = String.valueOf(c);
            //判断map中有没有这个字符串，如果没有这个字符串，
            //说明还没有出现和这个字符串一样的字母异位词，
            //要新建一个list，把它存放到map中
            if (!map.containsKey(keyStr))
                map.put(keyStr, new ArrayList<>());
            //把字符串存放到对应的list中
            map.get(keyStr).add(strs[i]);
        }
        //最后返回
        return new ArrayList<>(map.values());
    }

    public static void main(String[] args) {
        AnagramGrouper ag = new AnagramGrouper();
        String[] strs = {"eat", "tea", "tan", "ate", "nat", "bat"};
//        List<List<String>> result = ag.groupAnagrams1(strs);
        List<List<String>> result = ag.groupAnagrams2(strs);
//        List<List<String>> result = ag.groupAnagrams3(strs);

        // 打印结果  
        result.forEach(System.out::println);
    }
}